#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QButtonGroup>
#include <QMessageBox>
#include <QSettings>
#include <QComboBox>
#include <QHBoxLayout>
#include <QShortcut>
#include <QTableWidget>
#include <QtNetwork/QNetworkInterface>
#include "sql/sqlrequest.h"
#include "ServerTCP/servertcp.h"
#include "comboBoxModel/qcomboboxmodel.h"
#include "ekran/ekran_ocen.h"
#include "ekran/ekran_flag.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

struct buttonsLine
{
    QVBoxLayout* bvline;     // Слои с вертикальным разделением, куда добавляются кнопки
    QHBoxLayout* bhline;     // Слои с вертикальным разделением, куда добавляются кнопки
    QButtonGroup* bgroup;   // Группировки кнопок
    int value;              // Целое значение результата
    int click;
};

class MainWindow : public QMainWindow
{
#define ORGANIZATION_NAME "ISAP"
#define ORGANIZATION_DOMAIN "www.poomsae.ru"
#define APPLICATION_NAME "ISAP"

#define SETTINGS_START "settings/start"
#define SETTINGS_KORT "settings/kort"
#define SETTINGS_BASE "settings/base"
#define SETTINGS_SYST "settings/syst"
#define SETTINGS_KSUD "settings/ksud"
#define SETTINGS_HOST "settings/host"
#define SETTINGS_URL "settings/url"
#define SETTINGS_IDCONNECT "settings/idconnect"

    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    void closeEvent(QCloseEvent *event);

signals:
    void buttonClicked(QAbstractButton* button);
    void connectDevice(QJsonObject obj);
    void reconnectDevice(QJsonObject obj);
    void startPerfomance(QJsonObject obj);
    void participantsDevice(QJsonObject obj);
    void waitPerfomance(QJsonObject obj);
    void connectCountJudges(QJsonObject obj);
    void ocenkiSelect(QJsonObject obj);
    void stopVistup(QJsonObject obj);
    void deleteGradesJudges(QJsonObject obj);
    void openEkran(int countJudges, int pokaz);
    void sendDataSys(QJsonObject json, int kolPhum);
    void sendDataFlags(QJsonObject json);
    void sendJudgesOcen(QJsonObject json);
    void sendOcenSys(QJsonObject json);
    void sendOcenFlags(QJsonObject json);
    void readRange();

private slots:
    /// Настройка сервера
    void addBase();
    /// Проверяем чтобы были выбраны все настройки
    void proverka();
    /// Вывод настроек сервера
    void loadViewCutFreestyle();
    /// Переход к настройкам сервера
    void slotShortcutCtrlS();
    /// Переход к настройкам сервера
    void slotShortcutCtrlJ();
    /// Вывод выступлений доступных для оценивания
    void loadTablePerfomance();
    /// Вывод выступлений закончили выступление
    void loadTablePerfomanceEnd();
    /// Подключение судей к серверу
    void connectJudges(int idDevice);
    /// Подключение судей к серверу
    void connectTimekeeper(int idDevice);
    /// Подключение судей к серверу
    void connectParticipants(int idDevice);
    /// Отключение судей от сервера
    void diskonectJudges(int numSud);
    /// Судьи готовые выставлять оценки
    void perfomanceJudges(QJsonObject obj);
    /// Вывод оценок судей на сервере
    void readOcenki();
    /// Вывод оценок судей на сервере
    void readOcenkiPred();
    /// Итоговые оценки
    void sumOcenki();
    /// Создание ComboBox для записывания судей
    void createComboBox();
    ///
    void loadViewSettingsServer();
    ///
    void startAutoTimer();
    ///
    void updateTime();
    ///
    void updateTimePerfomance();
    ///
    void flagsLoadView();
    ///
    void sendParticipants();
    void loadCategories();
    void doSomething(int row, int column);
    void doSomethingEnd(int row, int column);
    void onButtonClicked(QAbstractButton *button);
    void on_send_clicked();

    void on_start_clicked();

    void on_prinat_clicked();

    void on_phum1_clicked();

    void on_phum2_clicked();

    void on_OK_clicked();

    /// Останавливает выступление
    void on_stopBtn_clicked();
    /// Выводит ранг спортсменов
    void on_range_clicked();

    void on_btn03_clicked();

    void on_stopTimer_clicked();

    void on_btnTimer_clicked();

    void on_del_clicked();

    void on_upd_clicked();

    void on_update_clicked();

    void on_delPerfomance_clicked();

    void on_OKFlags_clicked();

    void on_phum2Flags_clicked();

    void on_phum1Flags_clicked();

    void on_startFlags_clicked();

    void on_prinatFlags_clicked();

    void on_stopBtnFlags_clicked();

    void on_tableCategory_itemClicked(QTableWidgetItem* item);

    void showDialog();

private:
    Ui::MainWindow *ui;
    QSettings *settings;
    SqlRequest *sqlReguest;
    QComboBox *comboBox;
    ekran_ocen *ekran;
    ekran_flag *ekranFlag;
    buttonsLine groupsBtn[2];
    QHBoxLayout* groupsGrades[4];
    int countJudges, kortClick, sysClick, judgesClick, deviceSocket, pokazPhumse, idperfomance, deviceSocketTimekeeper, deviceSocketParticipants;
    int sumAccuracyObsh, sumPresentationObsh, sumObsh, sumPresentationTotal;
    int countVistup;
    int kolPhum, phumNum;
    int totalFirst, totalSecond, krugNomer, nomer, countConnectJudges = 0, countGrades = 0;
    int tmrInt = 0, tmrIntVistup = 0, secondPerfomance, timebegin;
    int minus03 = 0;
    int tempCalc, total, startInt = 0;
    QString deviceName, kategoria, sportsmen;
    QShortcut  *keyCtrlS, *keyCtrlEnter, *keyCtrlJ;  // объект сочетания клавиш Ctrl+S, Ctrl+F, left, right, space, Ctrl+Q
    ServerTCP *myTcpServer;
    QMap<QString,int> devices;
    QMap<QString,int> devicesTimekeeper;
    QMap<QString,int> devicesParticipants;
    QList<QPair<int,QString>> *values;
    QComboBoxModel *model;
    QPushButton *btn[2][7];
    QLineEdit *lscore[4][7];
    QTimer *tmr, *tmrPerfomance;
    QTableWidget *tableWidget, *tableWidgetEnd, *tableRange[3];
//    QTableWidget *tableRange[3];
    QTabWidget *tabRange;
    QJsonObject totalObj, settingObj;
    QPushButton *btnFlags[7];
    int loadTable = 0;
    int idvistpred = 0;
    QMap<int,int> totalVistup;
    QMap<int,int> totalPresentation;
    QMap<int,int> totalSum;
};
#endif // MAINWINDOW_H
